#!/usr/bin/env python
# coding: utf-8

# In[2]:


# -*- coding: utf-8 -*-
"""
全特征相关性分析方案
输入：encoded_data.csv（包含独热编码后的所有特征）
输出：高分辨率相关系数矩阵热力图
"""
# 设置中文字体和符号显示
plt.rcParams['font.sans-serif'] = ['SimHei']  # Windows 系统常用字体
# plt.rcParams['font.sans-serif'] = ['Heiti TC']  # macOS 系统常用字体
# plt.rcParams['font.sans-serif'] = ['WenQuanYi Zen Hei']  # Linux 系统常用字体

plt.rcParams['axes.unicode_minus'] = False  # 解决负号显示问题
#%% 模块一：依赖导入
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import os
from tqdm import tqdm

#%% 模块二：数据加载与预处理
def load_encoded_data(file_path, target_col='label'):
    """加载并验证编码后数据"""
    df = pd.read_csv(file_path)

    # 特征列校验
    if target_col not in df.columns:
        raise ValueError(f"目标列 {target_col} 不存在")

    # 分离特征与标签
    features = df.drop(columns=[target_col])

    # 验证特征数量
    if len(features.columns) < 20:
        raise ValueError("特征数量不足20个，请检查数据")

    # 自动识别连续特征（前7列）
    cont_features = features.columns[:7].tolist()
    print(f"识别到连续特征：{cont_features}")

    return features

#%% 模块三：大规模相关性分析
def analyze_full_correlation(features, save_dir='correlation_analysis'):
    """全特征相关性分析流程"""
    os.makedirs(save_dir, exist_ok=True)

    # ======================
    # 1. 全特征矩阵计算
    # ======================
    print("\n[1/3] 计算相关系数矩阵...")
    corr_matrix = features.corr(method='pearson')
    corr_matrix.to_csv(f"{save_dir}/full_correlation.csv")

    # ======================
    # 2. 可视化优化方案
    # ======================
    print("\n[2/3] 生成可视化图表...")

    # 方案A：完整矩阵（适合特征数 < 50）
    plt.figure(figsize=(40, 36))
    sns.heatmap(corr_matrix, 
                cmap='coolwarm', 
                center=0,
                annot=False,  # 关闭标注避免重叠
                cbar_kws={'shrink': 0.8})
    plt.title("全特征Pearson相关系数矩阵", fontsize=24, pad=25)
    plt.xticks(fontsize=8, rotation=90)
    plt.yticks(fontsize=8)
    plt.savefig(f"{save_dir}/full_heatmap.png", dpi=200, bbox_inches='tight')
    plt.close()

    # 方案B：高相关区域聚焦（适合特征数 > 50）
    high_corr = corr_matrix.abs().stack().reset_index()
    high_corr = high_corr[high_corr[0] > 0.7]
    high_corr.columns = ['Feature1', 'Feature2', 'Correlation']
    high_corr.to_csv(f"{save_dir}/high_correlations.csv", index=False)

    # ======================
    # 3. 高相关性特征分析
    # ======================
    print("\n[3/3] 生成分析报告...")
    generate_analysis_report(corr_matrix, save_dir)

    print(f"\n分析完成！结果保存至：{os.path.abspath(save_dir)}")

def generate_analysis_report(corr_matrix, save_dir):
    """生成分析报告"""
    report = []

    # 特征间最高相关性统计
    upper_tri = corr_matrix.where(np.triu(np.ones(corr_matrix.shape), k=1).astype(bool))
    max_corr = upper_tri.stack().groupby(level=0).max()
    report.append("各特征最大相关系数统计：")
    report.append(max_corr.sort_values(ascending=False).head(20).to_string())

    # 高风险特征对识别
    high_risk_pairs = []
    for (f1, f2), corr in tqdm(upper_tri.stack().items(), desc="分析特征对"):
        if abs(corr) > 0.9:
            risk_note = "极高风险（可能导致多重共线性）"
        elif abs(corr) > 0.7:
            risk_note = "高风险（建议检查特征冗余）"
        else:
            continue
        high_risk_pairs.append(f"{f1} & {f2}: {corr:.2f} | {risk_note}")

    report.append("\n高风险特征对：")
    report.extend(high_risk_pairs[:50])  # 显示前50对

    # 保存报告
    with open(f"{save_dir}/analysis_report.txt", 'w') as f:
        f.write("\n".join(report))

#%% 主流程
if __name__ == '__main__':
    # 参数配置
    DATA_PATH = 'encoded_data.csv'
    SAVE_DIR = 'correlation_analysis'

    try:
        # 1. 加载数据
        features = load_encoded_data(DATA_PATH)
        print(f"分析特征总数：{len(features.columns)}")

        # 2. 执行分析
        analyze_full_correlation(features, SAVE_DIR)

    except Exception as e:
        print(f"分析失败：{str(e)}")
        if 'features' in locals():
            print("特征样例：", features.columns[:10].tolist())


# In[ ]:




